/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.maven; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import org.apache.maven.plugins.shade.resource.ResourceTransformer; import org.jdom.Content; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class CXFAllTransformer implements ResourceTransformer { byte buffer[] = new byte[1024]; Map<String, ByteArrayOutputStream> extensions = new LinkedHashMap<String, ByteArrayOutputStream>(); String lastResource; public CXFAllTransformer() { super(); } public boolean canTransformResource(String r) { if (r.startsWith("META-INF/cxf/cxf-extension-") && r.endsWith(".xml")) { lastResource = r; return true; } return false; } public boolean hasTransformedResource() { return !extensions.isEmpty(); } public void processResource(String resource, InputStream is, List relocators) throws IOException { processResource(is); } public void processResource(InputStream is) throws IOException { ByteArrayOutputStream bout = new ByteArrayOutputStream(1024); int i = is.read(buffer); while (i != -1) { bout.write(buffer, 0, i); i = is.read(buffer); } extensions.put(lastResource, bout); } public void modifyOutputStream(JarOutputStream jos) throws IOException { List<String> imps = new ArrayList<String>(extensions.keySet()); for (Map.Entry<String, ByteArrayOutputStream> ent : extensions.entrySet()) { jos.putNextEntry(new JarEntry(ent.getKey())); ent.getValue().writeTo(jos); try { Document r = new SAXBuilder() .build(new ByteArrayInputStream(ent.getValue().toByteArray())); Element root = r.getRootElement(); for (Iterator itr = root.getChildren().iterator(); itr.hasNext();) { Content n = (Content)itr.next(); if (n instanceof Element) { Element e = (Element)n; if ("import".equals(e.getName()) && "http://www.springframework.org/schema/beans".equals(e.getNamespaceURI())) { //remove stuff that is imported from other extensions to //keep them from being loaded twice. (it's not an issue //to load them twice, there just is a performance //penalty in doing so String loc = e.getAttributeValue("resource"); if (loc.startsWith("classpath:META-INF/cxf/cxf")) { loc = loc.substring(10); imps.remove(loc); } } } } } catch (JDOMException e) { throw new RuntimeException(e); } } if (imps.size() > 0) { jos.putNextEntry(new JarEntry("META-INF/cxf/cxf-all.xml")); Writer writer = new OutputStreamWriter(jos, "UTF-8"); writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); writer.append("<beans xmlns=\"http://www.springframework.org/schema/beans\"\n"); writer.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); writer.append(" xsi:schemaLocation=\""); writer.append("http://www.springframework.org/schema/beans "); writer.append("http://www.springframework.org/schema/beans/spring-beans.xsd\">\n"); writer.append(" <import resource=\"classpath:META-INF/cxf/cxf.xml\"/>\n"); for (String res : imps) { writer.append(" <import resource=\"classpath:"); writer.append(res); writer.append("\"/>\n"); } writer.append("</beans>"); writer.flush(); } } }